//
// Created by wzh on 2021/1/13.
//

#ifndef EIGEN_HELPER_H
#define EIGEN_HELPER_H

#include <Eigen/Core>
#include <QVector>
#include <vector>


using Matd = Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
using Matf = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
using Vecd = Eigen::VectorXd;
using Vecf = Eigen::VectorXf;
using Arrd = Eigen::ArrayXd;


//把任意地容器转换为行数动态，列数为1的Eigen矩阵
template<typename Container>
inline static Eigen::Matrix<typename Container::value_type, -1, 1> toEigenVector(const Container &vector) {
    Eigen::Matrix<typename Container::value_type, -1, 1> M;
    M = Eigen::Matrix<typename Container::value_type, -1, 1>::Map(vector.data(), vector.size());
    return M;
}

template<typename Container>
inline static Eigen::Matrix<typename Container::value_type, -1, 1> toEigenMap(const Container &vector) {
    return Eigen::Matrix<typename Container::value_type, -1, 1>::Map(vector.data(), vector.size());
}


//把Eigen矩阵放到任意容器中
template<typename Container, typename Matrix>
inline static Container toAnyVector(const Matrix &M) {
    Container m(M.size());
    Matrix::Map(m.data(), M.rows(), M.cols()) = M;
    return m;
}

//把Eigen矩阵转为std::vector
template<typename Matrix>
inline static std::vector<typename Matrix::value_type> toStdVector(const Matrix &M) {
    return toAnyVector<std::vector<typename Matrix::value_type>>(M);
}

//把Eigen矩阵转为QVector
template<typename Matrix>
inline static QVector<typename Matrix::value_type> toQVector(const Matrix &M) {
    return toAnyVector<QVector<typename Matrix::value_type>>(M);
}


#endif //EIGEN_HELPER_H
